; (function() {
 
    
/**
 * 日期组件
 * 使用方法: 页面引用 date.js 文件
 * 格式：App.Calendar.init(obj,'model'); 
 * obj:需要绑定的对象 【必填】
 * model:要显示的model 【非必填】 默认model为1,
 * 1:生效日期视图  2:车辆登记日期视图 3：生日组件视图  4:发票开具日期  5:信用卡有效期
 */
    
    var Calendar = {
        bindObj: null,// 需要绑定的对象
        monthCnArray: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
        maxYear: '15',// 显示的年份个数，从当前年份向前递减，默认为15 
        weekArray: ['日', '一', '二', '三', '四', '五', '六'],
        CurrentDate: ['Second', 'Minute', 'Hour', 'Date', 'Day', 'Month', 'Year'],
        maxDays: '90',// 最大天数限制
        maxMonths: '1',// 最大月数限制，根据天数计算得出 ，默认为1
        dateObj: null,// 日期对象
        dayToDate: null,// 每月相同号对应的星期  
        showTime: ['y', 'm', 'd', 'h', 'mt', 's'], // 对应 年，月，日，小时，分钟，秒
        lastMonDays: null,// 根据最大天数限制计算出最后一个月的显示天数
        model: '1',// 显示的模式，默认为一,可以在crateContent()方法中自定义相关条件
        startMonth:null,
        startDay:null,
        n_st:false, // 是否选中年
        y_st:false, // 是否选中月
        r_st:false, // 是否选中天
        init: function(obj, model) {
            this.bindObj = obj;
            if (this.model != model && $(".dtCont").html() != ''){
                $(".dtCont").html('');
            }
            this.model = model;
            this.setDate();
            // 解决数据重复加载
            if ($(".dtCont").html() == null || $(".dtCont").html() == "") {
                this.selectModel();
            }
            Calendar.showOtherDiv(); // 初始化显示
        },
        getMaxMonths: function() { // 得到最大月数限制
            var i = 1,
            m_Day = parseInt(this.maxDays) + parseInt(this.CurrentDate.Date);
            for (; m_Day > parseInt(this.getDy(i)); i++) {
                m_Day = m_Day - this.getDy(i);
            }
            // this.lastMonDays = m_Day;
            this.maxMonths = i;
        },
        crateContent: function() { // 创建大容器
            $('body').append('<div id=\'dtCont\'></div>');
            $("#dtCont").addClass("dtCont");
        },
        selectModel: function() {
            this.crateContent();
            // 可以自定义模型,添加case
            switch (Calendar.model) {
                case '1':  // 生效日期
                    Calendar.addHead('选择日期');
                    Calendar.getMaxMonths();
                    Calendar.lastMonDays = Calendar.getCtToNDay(1,'d',Calendar.maxDays);
                    Calendar.startDay = Calendar.CurrentDate.Date;
                    Calendar.startMonth = Calendar.CurrentDate.Month;
                    this.effective_Date();
                    break;
                case '2':  // 车辆登记信息
                    Calendar.addHead('选择年月');
                    this.dateOfVehicleRegistration();
                    break;
                case '3':  // 生日日期
                    Calendar.addHead('选择生日');
                    this.brithday_Date();
                    break;
                case '4':  // 发票开具日期
                    Calendar.addHead('选择日期');
                    Calendar.getMaxMonths();
                    Calendar.lastMonDays = Calendar.CurrentDate.Date;
                    Calendar.startDay = Calendar.getCtToNDay(2,'d',Calendar.maxDays);
                    Calendar.startMonth = (Calendar.CurrentDate.Month-Calendar.maxMonths+1);
                    this.invoice_Date();
                    break;
                case '5':  // 信用卡有效期
                    Calendar.addHead('选择年月');
                    this.cardExpiryDate();
                    break;
            default:
                console.log("目前没有匹配的model，请自定义开发！");
            }
        },
        addHead: function(str) {
            $("#dtCont").append('<div id=\'c_top\'><div class=\'c_fh\'><a href=\'javascript:void()\' id=\'date_back\'>返回</a></div><div class=\'c_date\'>' + str + '</div></div>');
            $('#date_back').tap(function() {
                Calendar.hideOtherDiv();
            });
        },
        brithday_Date: function() {
            var ht=[];
            ht.push('<div class=\'tip\'>请选择月份</div>');
            ht.push('<div id=\'mArr\' class="bdr_bdt"><ul id=\'m_s\'></ul></div>');
            ht.push('<div class=\'tip\'>请选择日期</div>');
            ht.push('<div id=\'dArr\' class="bdr_bdt"><ul id=\'d_s\'></ul></div>');
            $("#dtCont").append(ht.join(''));
            for (var j = 0; j < this.monthCnArray.length; j++) {
                $("#m_s").append('<li id=' + parseInt(j + 1) + ' class=\'hand\'>' + this.monthCnArray[j] + '</li>');
            }
            for (var i = 1; i <= Calendar.getCtDy(1); i++) {
                $("#d_s").append('<li id=' + i + ' class=\'hand\'>' + i + '</li>');
            }
            var ms, ds;
            $('#dtCont').tap(function(e) {
                var t = e.target;
                if ("m_s" == $(t).parent().attr("id")) {
                    Calendar.clearSelected("#m_s li");
                    ms = Calendar.addZero($(t).attr("id"));
                    $("#d_s").html("");
                    Calendar.r_st=false;
                    for (var i = 1; i <= Calendar.getCtDy($(t).attr("id")); i++) {
                        $("#d_s").append('<li id=' + i + ' class=\'hand\'>' + i + '</li>');
                    }
                    Calendar.y_st=true;
                } else {
                    Calendar.clearSelected("#d_s li");
                    if (ms != null && ms != "") {
                        ds = Calendar.addZero($(t).html());
                    }
                    Calendar.r_st=true;
                }
                $(t).addClass("selected");
                if (Calendar.y_st == true && Calendar.r_st == true && Calendar.isUndefined(ds)!= true) {
                    Calendar.bindObj.html(ms + "-" + ds);
                    Calendar.hideOtherDiv();
                }
                $("#dtCont li").css("width", "24.7%");
            });
            // 设置页面展示风格，必须放在最下面
            $("#dtCont li").css("width", "24.7%");
        },
        cardExpiryDate:function(){ 
            var ht=[];
            ht.push('<div class=\'tip\'>请选择年份</div>');
            ht.push('<div id=\'yearArr\' class="bdr_bdt"><ul id=\'y_s\'></ul></div>');
            ht.push('<div class=\'tip\'>请选择月份</div>');
            ht.push('<div id=\'monthArr\' class="bdr_bdt"><ul id=\'m_s\'></ul></div>');
            $("#dtCont").append(ht.join(''));
            var y = parseInt(this.CurrentDate.Year);
            for (var i = 0; i < 12; i++) {
                $("#y_s").append('<li class=\'hand\'>' + y + '</li>');
                y++;
            }
            for (var j = 0; j < this.monthCnArray.length; j++) {
                $("#m_s").append('<li id=' + parseInt(j + 1) + ' class=\'hand\'>' + this.monthCnArray[j] + '</li>');
            }
            var ys, ms;
            $("#dtCont li").tap(function() {
                if ('m_s' == $(this).parent().attr("id")) {
                    Calendar.clearSelected("#m_s li");
                    ms = Calendar.addZero($(this).attr("id"));
                    Calendar.y_st=true;
                } else {
                    Calendar.clearSelected("#y_s li");
                    ys = $(this).html();
                    Calendar.n_st=true;
                }
                $(this).addClass("selected");
                if (Calendar.y_st == true && Calendar.n_st == true && Calendar.isUndefined(ms)!= true) {
                    Calendar.bindObj.html(ys + "-" + ms);
                    Calendar.hideOtherDiv();
                }
            });
            // 设置页面展示风格，必须放在最下面
            $("#dtCont li").css("width", "33%");
        },
        dateOfVehicleRegistration: function() { //  车辆登记日期
            var ht=[];
            ht.push('<div class=\'tip\'>请选择年份</div>');
            ht.push('<div id=\'yearArr\' class="bdr_bdt"><ul id=\'y_s\'></ul></div>');
            ht.push('<div class=\'tip\'>请选择月份</div>');
            ht.push('<div id=\'monthArr\' class="bdr_bdt"><ul id=\'m_s\'></ul></div>');
            $("#dtCont").append(ht.join(''));
            var y = parseInt(this.CurrentDate.Year);
            for (var i = 0; i < this.maxYear; i++) {
                $("#y_s").append('<li class=\'hand\'>' + y + '</li>');
                y--;
            }
            for (var j = 0; j < this.monthCnArray.length; j++) {
                $("#m_s").append('<li id=' + parseInt(j + 1) + ' class=\'hand\'>' + this.monthCnArray[j] + '</li>');
            }
            var ys, ms;
            $("#dtCont li").tap(function() {
                if ('m_s' == $(this).parent().attr("id")) {
                    Calendar.clearSelected("#m_s li");
                    ms = Calendar.addZero($(this).attr("id"));
                    Calendar.y_st=true;
                } else {
                    Calendar.clearSelected("#y_s li");
                    ys = $(this).html();
                    Calendar.n_st=true;
                }
                $(this).addClass("selected");
                if (Calendar.y_st == true && Calendar.n_st == true && Calendar.isUndefined(ms)!= true) {
                    Calendar.bindObj.html(ys + "-" + ms);
                    Calendar.hideOtherDiv();
                }
            });
            // 设置页面展示风格，必须放在最下面
            $("#dtCont li").css("width", "33%");
        },
        invoice_Date:function(){ // 发票开具日期
            for (var i = 1; i <= this.maxMonths; i++) {
                this.addDiv(i);
            }
        },
        effective_Date: function() { // 生效日期
            // 根据要显示的天数计算出月数统计出需要创建的子容器个数
            for (var i = 1; i <= this.maxMonths; i++) {
                this.addDiv(i);
            }
        },
        addDiv: function(i) { // 创建子容器
            var s = "date" + i;
            $("#dtCont").append('<div id=' + s + ' ></div>');
            this.addTitle(s, i);
        },
        addTitle: function(s, i) { // 日期头部显示年和月
            var y = "yearT" + i,
                stY = "stY" + i,
                stM = "stM" + i;
            $("#" + s).append('<div id=' + y + ' class="yearT"></div>');
            $("#" + y).append('<span id=' + stY + '></span>年<span id=' + stM + '></span>月');
            $("#" + stY).html(this.getYr(i));
            $("#" + stM).html(this.getMt(i));
            this.addWeek(y, i);
        },
        addWeek: function(y, i) { // 用于显示 monthCnArray
            var w = "week" + i;
            $("#" + y).after('<div id=' + w + ' class="bdr_bdt"><ul></ul></div>');
            $("#" + w + " ul").addClass("week");
            for (var j = 0; j < this.weekArray.length; j++) {
                $("#" + w + " ul").append('<li>' + this.weekArray[j] + '</li>');
            }
            // 获得每个月1号对应星期几
            this.dayToDate = this.getWeek(this.getYr(i) + "/" + this.getMt(i) + "/" + '1');
            this.addBlank(w, i);
        },
        addBlank: function(w, i) { // 添加空白区域
            var d = "day" + i;
            $("#" + w).after('<div id=' + d + ' class="bdr_bdt"><ul></ul></div>');
            // 用当月第一天在一周中的日期值作为当月离第一天的天数 
            for (var h = 0; h < this.dayToDate; h++) {
                $("#" + d + " ul").append('<li>&nbsp;</li>');
            }
            this.addDay(d, i);
        },
        addDay: function(d, i) { // 根据i获取当前月份，然后根据月份获取当月天数
            $("#" + d + " ul").addClass("day");
            for (var k = 1; k <= this.getDy(i); k++) { // 生效日期从当前日期的后一天开始算
                if (i == parseInt(this.maxMonths)) {
                    if (k <= this.lastMonDays) {
                        $("#" + d + " ul").append('<li id=' + i + ' class=\'hand\'>' + k + '</li>');
                    } else {
                        $("#" + d + " ul").append('<li class=\'nohand\'>' + k + '</li>');
                    }
                } else {
                    if (this.getMt(i) == Calendar.startMonth && k <= Calendar.startDay) {
                        $("#" + d + " ul").append('<li class=\'nohand\'>' + k + '</li>');
                    } else {
                        $("#" + d + " ul").append('<li id=' + i + ' class=\'hand\'>' + k + '</li>');
                    }
                }
            }
            var sty, stm, std;
            // 绑定点击事件
            $("#" + d + " li").tap(function() {
                sty = $("#stY" + i).html();
                stm = Calendar.addZero($("#stM" + i).html());
                std = Calendar.addZero($(this).html());
                // 空白部分不绑定事件
                if ($(this).attr("id")) {
                    Calendar.bindObj.html(sty + '-' + stm + '-' + std);
                    Calendar.clearSelected("#dtCont li");
                    $(this).addClass("selected");
                    Calendar.hideOtherDiv();
                }
            });
            this.addEndBlank(d, i);
        },
        clearSelected: function(obj) { // 移除指定区域的选中样式
            $(obj).each(function() {
                $(this).removeClass("selected");
            });
        },
        addEndBlank: function(d, i) {
            // 根据每个月最后一天星期几计算补白部分
            this.dayToDate = this.getWeek(this.getYr(i) + "/" + this.getMt(i) + "/" + this.getDy(i));
            for (var h = 0; h < 6 - this.dayToDate; h++) {
                $("#" + d + " ul").append('<li>&nbsp;</li>');
            }
            // 设置页面展示风格，必须放在最下面
            $("#dtCont li").css("width", "14%");
        },
        getDy: function(i) { // 以当前月为前提得到每个月的天数
            // 用当月最后一天在一个月中的日期值作为当月的天数 
            return new Date(this.getYr(i), this.getMt(i), 0).getDate();
        },
        getCtDy: function(i) { // 判断当前年份的每个月的天数
            return new Date(this.CurrentDate.Year, i, 0).getDate();
        },
        getWeek: function(str) { // 动态获取每月的对应号星期几 
            return new Date(str).getDay();
        },
        getMt: function(i) { // 获取月份
            // 如果当前月份小于13，则直接返回当然月份
            if (Calendar.startMonth + i <= 13) {
                return (Calendar.startMonth + i - 1);
            } else {
                return ((Calendar.startMonth + i) - (parseInt(i / 12) * 12) - 13);
            }
        },
        getYr: function(i) { // 根据添加的月份增加年份
            if (Calendar.startMonth + i > 13) {
                return (this.CurrentDate.Year + parseInt((Calendar.startMonth + i) / 12));
            } else {
                return this.CurrentDate.Year;
            }
        },
        setDate: function() {
            dateObj = new Date();
            this.CurrentDate.Second = dateObj.getSeconds() + 1; // getSeconds() 返回时间的秒 (0到59)
            this.CurrentDate.Minute = dateObj.getMinutes() + 1; // getMinutes() 返回分钟 (0到59)
            this.CurrentDate.Hour = dateObj.getHours() + 1; // getHours() 返回一天中的时针点数（0到23）
            this.CurrentDate.Day = dateObj.getDay(); // getDay() 返回星期中的第几天 (0到7)
            this.CurrentDate.Date = dateObj.getDate(); // getDate() 返回月份中的第几日(1到31)
            this.CurrentDate.Month = dateObj.getMonth() + 1; // getMonth()返回年份中的第几月(0到11)
            this.CurrentDate.Year = dateObj.getFullYear(); // getFullYear()返回年份
        },
        getTomorrow:function(obj){
            this.setDate();
            var tomoDate = Calendar.CurrentDate.Year+"-"+Calendar.CurrentDate.Month+"-"+(Calendar.CurrentDate.Date+1);
            obj.html(tomoDate);
        },
        getCtToNDay:function(Operators,returnObj,nday){ // 得到当前日期后N天或前N天
            var y,m,d,t,t1 = new Date().getTime(),t2=nday*1000*3600*24;
             if (Operators == 1){
                t1 += t2;
             }
             else{
                t1 -= t2;
             }
             t = new Date(t1);
             switch (returnObj) {
                case 'y':
                    y = t.getFullYear();
                    return y;
                    break;
                case 'm':
                    m = t.getMonth() + 1;
                    return m;
                    break;
                case 'd':
                    d = t.getDate();
                    return d;
                    break;
             default:
                console.log("目前没有匹配的返回内容，请自定义开发！");
            }
        },
        addZero: function(obj) { // 根据值的大小补零
            if (10 > obj) {
                return "0" + obj;
            }
            return obj;
        },
        isUndefined:function(variable) {
            return typeof variable == 'undefined' ? true : false;
        },
        showOtherDiv: function() {
            Calendar.n_st=false;
            Calendar.y_st=false;
            Calendar.r_st=false;
            $("#dtCont").show();
            $("#dtCont div").show();
            $('body').css("overflow", "hidden");
            setTimeout(function(){
                Calendar.clearSelected($("#dtCont li"));
            },100);
        },
        hideOtherDiv: function() {
            // setTimeout(function(){
                $("#dtCont").hide();
                $("#dtCont div").hide();
                $('body').css("overflow", "visible");
            // },1500);
        }
    };
    App.Calendar = Calendar;
})();